home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib08.dsk / PROGRAM PROTECTOR.bas < prev    next >
BASIC Source File  |  2023-02-26  |  11KB  |  192 lines

  1. 1  REM  **********************
  2. 2  REM  * PROGRAM PROTECTOR  *
  3. 3  REM  * BY K. STATTENFIELD *
  4. 4  REM  * COPYRIGHT (C) 1982 *
  5. 5  REM  * BY MICRO-SPARC INC *
  6. 6  REM  * LINCOLN, MA. 01773 *
  7. 7  REM  **********************
  8. 220  DIM SC$(6),L%(6,40):Y1% = 1:Y2% = 6
  9. 230  TEXT : HOME : NORMAL : SPEED= 255: POKE 48,170: DEF  FN P(X) =  PEEK(X) + PEEK(X +1) *256
  10. 240  HLIN 0,39 AT 0: HLIN 0,39 AT 46: VLIN 0,46 AT 0: VLIN 0,46 AT 39: POKE 32,2: POKE 33,36: POKE 34,2: POKE 35,22: HOME 
  11. 250 A$ = "PROGRAM PROTECTOR": GOSUB 905:A$ = "BY: KEITH STATTENFIELD": GOSUB 905: PRINT : HLIN 0,39 AT 10: POKE 34, PEEK(37) +1
  12. 260  VTAB 10:A$ = "COPYRIGHT 1982 BY": GOSUB 905: PRINT :A$ = "MICRO-SPARC INC.": GOSUB 905: PRINT :A$ = "LINCOLN, MA. 01773": GOSUB 905
  13. 270  FOR P = 1 TO 40:L%(1,P) = 1023 +P:L%(2,P) = 1151 +P:L%(3,P) = 1279 +P:L%(4,P) = 1407 +P:L%(5,P) = 1535 +P:L%(6,P) = 1663 +P: NEXT 
  14. 280  FOR D = 1 TO 1000: NEXT 
  15. 290  HOME : PRINT :A$ = "THIS PROGRAM WILL HELP YOU": GOSUB 905: PRINT 
  16. 300 A$ = "PROTECT APPLESOFT PROGRAMS BY": GOSUB 905: PRINT 
  17. 310 A$ = "NOT ALLOWING THEM TO BE LISTED,": GOSUB 905: PRINT 
  18. 320 A$ = "AND BY REQUIRING A CODEWORD TO": GOSUB 905: PRINT 
  19. 330 A$ = "BE TYPED IN TO USE THE PROGRAM.": GOSUB 905: PRINT 
  20. 340 A$ = "TO USE, SIMPLY FOLLOW THE": GOSUB 905: PRINT 
  21. 350 A$ = "INSTRUCTIONS IN THIS PROGRAM.": GOSUB 905
  22. 360  GOSUB 900: HOME 
  23. 370  PRINT :A$ = "THE FIRST THING I NEED YOU TO": GOSUB 905: PRINT 
  24. 380 A$ = "DO IS TYPE IN A SIX LINE COMMENT": GOSUB 905: PRINT 
  25. 390 A$ = "TO BE PRINTED WHENEVER THE PROGRAM": GOSUB 905: PRINT 
  26. 400 A$ = "IS FIRST RUN. YOU CAN USE NO MORE": GOSUB 905: PRINT 
  27. 410 A$ = "THAN SIX LINES OF FORTY CHARACTERS.": GOSUB 905: PRINT 
  28. 420 A$ = "TO TYPE IN THESE LINES, YOU WILL": GOSUB 905: PRINT 
  29. 430 A$ = "USE A SMALL TEXT EDITOR.": GOSUB 905
  30. 440  GOSUB 900: HOME : PRINT 
  31. 450 A$ = "TO USE THE EDITOR:": GOSUB 905:A$ = "------------------": GOSUB 905
  32. 460 A$ = "IN THE EDITOR, YOU HAVE TWO MODES:": GOSUB 905
  33. 470 A$ = "ESCAPE MODE, AND TEXT MODE. IN ESC": GOSUB 905
  34. 480 A$ = "MODE YOU CAN MOVE THE CURSOR": GOSUB 905
  35. 490 A$ = "VERTICALLY,AND CAN ALSO CENTER THE": GOSUB 905
  36. 500 A$ = "LINE THE CURSOR IS ON, OR MOVE IT": GOSUB 905
  37. 510 A$ = "LEFT OR RIGHT. YOU CAN FILL A": GOSUB 905
  38. 520 A$ = "LINE WITH ANY CHARACTER, OR DELETE": GOSUB 905
  39. 530 A$ = "ALL OF THE CHARACTERS ON A LINE.": GOSUB 905
  40. 540 A$ = "YOU EXIT THE EDITOR FROM THIS MODE.": GOSUB 905
  41. 550  GOSUB 900: VTAB 10: CALL  -958
  42. 552 A$ = "THE OTHER EDITOR MODE IS TEXT MODE.": GOSUB 905
  43. 553 A$ = "FROM TEXT MODE YOU TYPE CHARACTERS": GOSUB 905
  44. 554 A$ = "IN LIKE ON A TYPEWRITER.": GOSUB 905
  45. 555  PRINT : PRINT 
  46. 560 A$ = "INSTRUCTIONS FOR THE EDITOR ARE": GOSUB 905
  47. 570 A$ = "PRINTED WHILE YOU ARE USING": GOSUB 905
  48. 580 A$ = "THE EDITOR. HAPPY PROTECTING!": GOSUB 905: GOSUB 900
  49. 650  TEXT : HOME :Y1% = 1:Y2% = 6
  50. 660  GOTO 1000
  51. 670  REM  Y1% Y MINIMUM FOR EDITOR
  52. 680  REM  Y2% Y MAXIMUM FOR EDITOR
  53. 800  IF  PEEK(222) = 255  THEN  RESUME 
  54. 810  IF  PEEK(222) = 77  THEN  CLEAR : PRINT  CHR$(4);"MAXFILES1": RUN 
  55. 820  IF  PEEK(222) = 22  THEN  RUN 
  56. 900  VTAB 24: HTAB 6: PRINT " HIT ANY KEY TO CONTINUE ";: POKE  -16368,0: WAIT  -16384,128: POKE  -16368,0: POKE 48,170: HLIN 0,39 AT 46: HLIN 0,39 AT 47: RETURN 
  57. 905  HTAB  PEEK(33)/2 - LEN(A$)/2 +1: PRINT A$: RETURN 
  58. 956  FOR D = 1 TO 2000: NEXT D
  59. 990  REM 
  60. 991  REM 
  61. 992  REM  ******************
  62. 993  REM  **              **
  63. 994  REM  **    EDITOR    **
  64. 995  REM  **              **
  65. 996  REM  ******************
  66. 997  REM 
  67. 998  REM 
  68. 999  REM 
  69. 1000  VTAB 3:A$ = "YOUR TEXT GOES HERE": GOSUB 905
  70. 1010  VTAB 1: FOR P = 1 TO 6: PRINT SC$(P): NEXT : ONERR  GOTO 1903
  71. 1020  PRINT "----------------------------------------";
  72. 1030 X = 1:Y = 1:L = L%(Y,X):C =  PEEK(L): GOSUB 1500: POKE  -16368,0
  73. 1040  POKE L,C:L = L%(Y,X):C =  PEEK(L): POKE L,43: WAIT  -16384,128:K =  PEEK( -16384): POKE  -16368,0
  74. 1050  IF K = 155  THEN ESC =   NOT ESC: ON ESC +1 GOSUB 1500,1700
  75. 1060  IF K = 143  THEN K = 223
  76. 1070  IF K = 139  THEN K = 219
  77. 1080  IF K = 140  THEN K = 220
  78. 1090  IF   NOT ESC  THEN 1250
  79. 1100  IF K = 141  THEN K = 205
  80. 1110  IF K = 198  THEN  VTAB 8: HTAB 1: CALL  -868: PRINT "CHARACTER?";: POKE  -16368,0: GET A$: PRINT A$:K =  ASC(A$) +128: IF K < >155  THEN  VTAB Y: HTAB 1: FOR P = 1 TO 40: PRINT  CHR$(K);: NEXT :C = K: POKE  -16368,0
  81. 1120  IF K = 218  THEN  VTAB 8: HTAB 1: CALL  -868: PRINT "SURE?";: POKE  -16368,0: GET A$: PRINT A$: IF A$ = "Y"  THEN  VTAB Y: CALL  -868:C = 160: POKE  -16368,0
  82. 1130  IF K = 201  THEN Y = Y -1: IF Y <Y1%  THEN Y = Y2%
  83. 1140  IF K = 205  THEN Y = Y +1: IF Y >Y2%  THEN Y = Y1%
  84. 1150  IF K = 202  THEN X = X -5: IF X <1  THEN X = X +40
  85. 1160  IF K = 203  THEN X = X +5: IF X >40  THEN X = X -40
  86. 1170  IF K = 136  THEN X = X -1: IF X <1  THEN X = 40
  87. 1180  IF K = 149  THEN X = X +1: IF X >40  THEN X = 1
  88. 1190  IF K = 195  THEN 1310
  89. 1200  IF K = 204  THEN 1340
  90. 1210  IF K = 210  THEN 1370
  91. 1220  IF K = 216  THEN  VTAB 8: HTAB 1: CALL  -868: PRINT "DONE?";: POKE  -16368,0: GET A$: PRINT A$: POKE  -16368,0: IF A$ = "N"  THEN  VTAB 8: HTAB 1: CALL  -868: GOTO 1040
  92. 1230  IF K = 216  AND A$ = "Y"  THEN 1900
  93. 1240  GOTO 1040
  94. 1250  IF K = 136  THEN X = X -1: IF X <1  THEN X = 40:Y = Y -1: IF Y <Y1%  THEN Y = Y2%
  95. 1260  IF K = 149  THEN X = X +1: IF X >40  THEN X = 1:Y = Y +1: IF Y >Y2%  THEN Y = Y1%
  96. 1270  IF K = 141  THEN X = 1:Y = Y +1: IF Y >Y2%  THEN Y = Y1%
  97. 1280  IF K >159  THEN  POKE L,K:X = X +1: IF X >40  THEN X = 1:Y = Y +1: IF Y >Y2%  THEN Y = Y1%
  98. 1290  IF K >159  THEN C = K
  99. 1300  GOTO 1040
  100. 1310  VTAB 8: HTAB 20: CALL  -868: PRINT "CENTER LINE": GOSUB 1400: GOSUB 1440
  101. 1320 A$ =  MID$ (C$,S,P -S +1): VTAB Y: CALL  -868: GOSUB 905
  102. 1330 C =  PEEK(L): GOTO 1040
  103. 1340  VTAB 8: HTAB 20: CALL  -868: PRINT "MOVE LEFT": GOSUB 1400
  104. 1350 A$ =  RIGHT$(C$,39) + LEFT$(C$,1): VTAB Y: CALL  -868: HTAB 1: PRINT A$
  105. 1360 C =  PEEK(L): GOTO 1040
  106. 1370  VTAB 8: HTAB 20: CALL  -868: PRINT "MOVE RIGHT": GOSUB 1400
  107. 1380 A$ =  RIGHT$(C$,1) + LEFT$(C$,39): VTAB Y: CALL  -868: HTAB 1: PRINT A$
  108. 1390 C =  PEEK(L): GOTO 1040
  109. 1400 C$ = "": POKE L,C:L = L%(Y,1): FOR P = 1 TO 40
  110. 1410 C$ = C$ + CHR$( PEEK(L +P -1))
  111. 1420  NEXT :P =  FRE(0): RETURN 
  112. 1430  GOTO 1040
  113. 1440  FOR P = 1 TO  LEN(C$):K =  ASC( MID$ (C$,P))
  114. 1450  IF K = 32  OR K = 160  THEN  NEXT 
  115. 1460 S = P: FOR P = 40 TO 1  STEP  -1:K =  ASC( MID$ (C$,P))
  116. 1470  IF K = 32  OR K = 160  THEN  NEXT 
  117. 1480 E = P:L = E -S +1: IF L <39  THEN  RETURN 
  118. 1490  GOTO 1040
  119. 1500  VTAB 8: CALL  -958: PRINT A$ = "TEXT MODE": GOSUB 905: PRINT :A$ = "TEXT MODE IS USED TO TYPE IN": GOSUB 905
  120. 1510 A$ = "THE LETTERHEAD DESIRED. COMMANDS ARE:": GOSUB 905
  121. 1520  PRINT : PRINT "    1) RETURN : MOVE DOWN ONE LINE": PRINT "    2) -->    : MOVE CURSOR FORWARD ONE": PRINT "       CHARACTER"
  122. 1530  PRINT "    3) <--    : MOVE CURSOR BACK ONE": PRINT "       CHARACTER": PRINT "    4) CTRL O : PRINTS AS "; CHR$(95)
  123. 1540  PRINT "    5) CTRL K : PRINTS AS "; CHR$(91): PRINT "    6) CTRL L : PRINTS AS "; CHR$(92)
  124. 1550  RETURN 
  125. 1700  VTAB 8: CALL  -958: PRINT A$ = "ESC MODE": GOSUB 905: PRINT 
  126. 1710  PRINT "COMMANDS ARE: ";: HTAB 20: PRINT "UP": PRINT : PRINT "LEFT";: HTAB 35: PRINT "RIGHT": PRINT : HTAB 18: PRINT "DOWN": VTAB 12
  127. 1720  HTAB 20: PRINT "I": HTAB 10: PRINT "<-- OR J";: HTAB 23: PRINT "K OR -->": HTAB 20: PRINT "M": PRINT 
  128. 1730  PRINT "C - CENTER LINE CURSOR IS ON": PRINT "L - MOVE LINE CURSOR IS ON LEFT": PRINT "R - MOVE LINE CURSOR IS ON RIGHT"
  129. 1740  PRINT "F - FILL LINE CURSOR IS ON WITH A": PRINT "    CHARACTER": PRINT "Z - DELETE ALL CHARACTERS IN LINE": PRINT "    CURSOR IS ON"
  130. 1750  PRINT "X - EXIT TEXT EDITOR": RETURN 
  131. 1900  FOR Y = Y1% TO Y2%: GOSUB 1400:SC$(Y) = C$: NEXT 
  132. 1902  GOTO 2000
  133. 1903  IF  PEEK(222) = 255  THEN  RESUME 
  134. 1904  END 
  135. 1905  REM 
  136. 1910  REM 
  137. 1915  REM 
  138. 1920  REM  ******************
  139. 1925  REM  **              **
  140. 1930  REM  ** GET CODEWORD **
  141. 1935  REM  **     AND      **
  142. 1940  REM  **  POKE  DATA  **
  143. 1945  REM  ** INTO PROTECT **
  144. 1950  REM  **    PROGRAM   **
  145. 1955  REM  **              **
  146. 1960  REM  ******************
  147. 1965  REM 
  148. 1970  REM 
  149. 1975  REM 
  150. 2000  HOME : FOR P = 1 TO 6: PRINT SC$(P);: NEXT 
  151. 2010  VTAB 7: CALL  -958
  152. 2020 CODEWRD$ = "": POKE  -16368,0: GOTO 2090
  153. 2030  WAIT  -16384,128:K =  PEEK( -16384) -128: POKE  -16368,0: IF K = 27  THEN 2030
  154. 2040  IF K = 13  THEN 2110
  155. 2050  IF K = 8  AND  LEN(CODEWRD$) = 1  THEN 2020: GOTO 2090
  156. 2060  IF K = 8  AND  LEN(CODEWRD$) >1  THEN CODEWRD$ =  LEFT$(CODEWRD$, LEN(CODEWRD$) -1): GOTO 2090
  157. 2070  IF K <32  THEN  VTAB 20: PRINT "NO CONTROL CHARACTERS PLEASE!!": CALL  -198: GOTO 2090
  158. 2080 CODEWRD$ = CODEWRD$ + CHR$(K): IF  LEN(CODEWRD$) >19  THEN 2110
  159. 2090  VTAB 9: PRINT "PLEASE ENTER THE CODE ";CODEWRD$;: FLASH : PRINT " ";: NORMAL : PRINT " "; CHR$(8)
  160. 2100  GOTO 2030
  161. 2110  VTAB 9: PRINT "THE CODEWORD IS: ";CODEWRD$;: CALL  -958: IF CODEWRD$ = ""  THEN  INVERSE : PRINT "NO CODEWORD": NORMAL 
  162. 2120  VTAB 12: CALL  -958: HTAB 1: PRINT "IS THIS CORRECT?";: POKE  -16368,0
  163. 2130  GET A$: PRINT A$: IF A$ = "N"  THEN 2010
  164. 2140 W% = 60: IF  LEN(CODEWRD$) >0  THEN W% = 0
  165. 2150  VTAB 16: CALL  -868:A$ = "GETTING PROTECT PROGRAM": GOSUB 905
  166. 2160  PRINT  CHR$(4);"BLOAD PROTECT"
  167. 2170  VTAB 16: CALL  -868:A$ = "NOW STORING SCREEN DATA & CODE WORD": GOSUB 905
  168. 2180 A$ = "": FOR P = 1 TO 6:A$ = A$ +SC$(P): NEXT : IF CODEWRD$ < >""  THEN A$ = A$ +"ENTER THE CODE:"
  169. 2190  IF  LEN(A$) <255  THEN A$ = A$ +" ": GOTO 2190
  170. 2200 S = 2065: FOR P = 1 TO 255:K =  ASC( MID$ (A$,P)):K = K +128 *(K <128)
  171. 2210  POKE P +S,K: NEXT :S = S +256
  172. 2220  IF  LEN(CODEWRD$) = 0  THEN  POKE S,0: GOTO 2240
  173. 2230  POKE S, LEN(CODEWRD$): FOR P = 1 TO  LEN(CODEWRD$):K =  ASC( MID$ (CODEWRD$,P)):K = K +128 *(K <128): POKE P +S,K: NEXT 
  174. 2240 S = S +21: POKE S, PEEK(103): POKE S +1, PEEK(104)
  175. 2250  POKE S +2,W%
  176. 2260  VTAB 16: CALL  -868:A$ = "WRITING DISK FILE": GOSUB 905
  177. 2270 D$ =  CHR$(4):Q$ =  CHR$(34):N$ = "PROTECT.EXEC":S =  FN P(103): POKE 51,128
  178. 2280  PRINT D$;"OPEN";N$: PRINT D$;"DELETE";N$
  179. 2290  PRINT D$;"OPEN";N$: PRINT D$;"WRITE";N$
  180. 2300  PRINT "S=PEEK(103)+PEEK(104)*256:POKE 103,1:POKE 104,8"
  181. 2310  ONERR  GOTO 2420
  182. 2320  PRINT "?";Q$;"NOW SAVE THE PROGRAM. IT IS PROTECTED";Q$
  183. 2330  PRINT D$;"CLOSE";N$
  184. 2340  HOME : PRINT "TO PROTECT THE PROGRAM, FOLLOW THESE STEPS:": PRINT 
  185. 2350  PRINT "1) LOAD THE PROGRAM YOU WISH PROTECTED": PRINT 
  186. 2360  PRINT "2) RE-INSERT THIS DISK INTO THE DRIVE": PRINT 
  187. 2370  PRINT "3) TYPE ";Q$;"EXEC ";N$;Q$: PRINT 
  188. 2380  PRINT "4) WAIT UNTIL THE MESSAGE TELLING YOU": PRINT "   TO SAVE THE PROGRAM APPEARS.": PRINT 
  189. 2390  PRINT "5) SAVE THE PROGRAM.": PRINT 
  190. 2400  POKE 34, PEEK(37)
  191. 2410  END 
  192. 2420  IF  PEEK(222) = 255  THEN  RESUME